package com.atguigu.juc.cas;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author yanglin
 * @create 2024-01-24 15:50 星期三
 * description:
 */
public class CASDemo {

    /**
     * CAS是JDK提供的非阻塞原子性操作，它通过硬件保证了比较-更新的原子性
     *  Unsafe
     *  CAS是一条CPU的原子指令，不会造成数据不一致问题
     *  总结：
     *      CAS是靠硬件实现的从而在硬件层面提升效率，最底层还是交给硬件来保证原子性和可见性
     *      
     *  CAS的缺点：
     *      循环时间长开销很大
     *      ABA问题：
     *          线程1从内存位置V中取出A，这时候另一个线程2也从内存中取出A，并且线程2进行了一些操作将值变成了B，
     *          然后线程2又将V位置的数据变成了A，这时候线程1进行CAS操作发现内存中仍然是A，预期OK，然后线程A操作成功
     */
    
    
    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(5);
        boolean b = atomicInteger.compareAndSet(5, 2022);   //boolean:标识是否修改成功
        System.out.println(b);
        System.out.println(atomicInteger.get());
        boolean b1 = atomicInteger.compareAndSet(5, 2023);
        System.out.println(b1);
        System.out.println(atomicInteger.get());
        atomicInteger.getAndIncrement();
    }
    
    
}
